/*
 * Copyright (c) 2007-2020 西安交通信息投资营运有限公司 版权所有
 */

package com.xci.edu.core.service;

import com.github.lvyanyang.annotation.BindingOperateUser;
import com.github.lvyanyang.annotation.OperateLog;
import com.github.lvyanyang.core.BoolResult;
import com.github.lvyanyang.core.PageList;
import com.github.lvyanyang.core.XCI;
import com.github.lvyanyang.sys.core.BaseSysService;
import com.xci.edu.core.dao.ExamPaperDao;
import com.xci.edu.core.dao.ExamPaperDetailsDao;
import com.xci.edu.core.entity.ExamPaper;
import com.xci.edu.core.entity.ExamPaperDetails;
import com.xci.edu.core.filter.ExamPaperFilter;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;

/**
 * 试卷信息服务
 * @author 马星俊 maxingjun@xci96716.com
 * @since 2020-11-25 10:52:08
 */
@Service
public class ExamPaperService extends BaseSysService {
    /** 试卷信息数据层对象 */
    @Resource private ExamPaperDao examPaperDao;
    /** 试卷试题信息服务 */
    @Resource private ExamPaperDetailsService examPaperDetailsService;

    /**
     * 新建试卷信息
     * @param entity 试卷信息实体
     */
    @BindingOperateUser
    @OperateLog(msg = "新建试卷信息", module = "试卷信息")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult insert(ExamPaper entity) {
        return save(entity, true);
    }

    /**
     * 批量添加试卷试题信息
     * @param
     */
    @BindingOperateUser
    @OperateLog(msg = "新建试卷信息", module = "试卷信息")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult batchSave(String paperId,String[] ids) {
        List<ExamPaperDetails> entities = new ArrayList<>();
        ExamPaperDetails examPaperDetails;
        for (int i=0;i<ids.length;i++){
            examPaperDetails = new ExamPaperDetails();
            examPaperDetails.setPaperId(Long.valueOf(paperId));
            examPaperDetails.setQuestionId(Long.valueOf(ids[i]));
            examPaperDetails.setPath(i);
            entities.add(examPaperDetails);
        }
        return examPaperDetailsService.batchSave(entities);
    }

    /**
     * 修改试卷信息
     * @param entity 试卷信息实体
     */
    @BindingOperateUser
    @OperateLog(msg = "修改试卷信息", module = "试卷信息")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult update(ExamPaper entity) {
        return save(entity, false);
    }

    /**
     * 修改试卷信息状态
     * @param ids    试卷信息主键字符串
     * @param status 试卷信息状态
     */
    @OperateLog(msg = "修改试卷信息状态", module = "试卷信息")
    @Transactional(rollbackFor = Exception.class)
    public void updateStatus(@NotBlank(message = "请指定试卷信息主键字符串") String ids, @NotNull(message = "请指定试卷信息状态") Boolean status) {
        XCI.forEachIds(ids, id -> {
            examPaperDao.updateStatus(id, status);
        });
    }

    /**
     * 删除试卷信息
     * @param ids 试卷信息主键字符串
     */
    @OperateLog(msg = "删除试卷信息", module = "试卷信息")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult delete(@NotBlank(message = "请指定试卷信息主键字符串") String ids) {
        XCI.forEachIds(ids, id -> {
            var entity = examPaperDao.selectById(id);
            if (entity == null) return;

            examPaperDao.deleteById(entity.getId());
            logService.saveDeleteHistoryLogAsync(entity.getId(), entity);
        });
        return BoolResult.success();
    }

    /**
     * 根据主键查询单个试卷信息
     * @param id 试卷信息主键
     * @return 返回试卷信息实体
     */
    public ExamPaper selectById(@NotNull(message = "请指定试卷信息主键") Long id) {
        return examPaperDao.selectById(id);
    }


    /**
     * 查询试卷信息(下拉框)
     * @param eduCategoryId 科目主键
     * @return 返回试卷信息(下拉框)
     */
    public List<ExamPaper> getPaperIdAndPaperName(String eduCategoryId) {
        return examPaperDao.getPaperIdAndPaperName(eduCategoryId);
    }

    /**
     * 查询试卷信息列表
     * @param filter 过滤条件
     * @return 返回试卷信息列表
     */
    public List<ExamPaper> selectList(ExamPaperFilter filter) {
        return examPaperDao.selectList(filter);
    }

    /**
     * 查询试卷信息分页列表
     * @param filter 过滤条件
     * @return 返回试卷信息分页列表
     */
    public PageList<ExamPaper> selectPageList(ExamPaperFilter filter) {
        return PageList.of(examPaperDao.selectPageList(filter));
    }

    /**
     * 保存数据,在insert和update之前和之后的校验和处理
     * @param entity  试卷信息实体
     * @param created 是否新建
     */
    private BoolResult save(ExamPaper entity, boolean created) {
        //新建时如果主键未指定,自动设置主键
        XCI.ifTrueAction(XCI.invalidId(entity.getId(), created), () -> entity.setId(XCI.nextId()));
        //若试卷类型为普通试卷，则确保自动生成试题设置为空
        if(entity.getPaperCategory()==1){
            entity.setAutoRadioCount(null);
            entity.setAutoCheckboxCount(null);
            entity.setAutoYesnoCount(null);
        }
        //更新数据库
        if (created) {
            examPaperDao.insert(entity);
            logService.saveInsertHistoryLogAsync(entity.getId(), entity);
        } else {
            var before = examPaperDao.selectById(entity.getId());
            examPaperDao.update(entity);
            logService.saveUpdateHistoryLogAsync(entity.getId(), before, entity);
        }
        return BoolResult.success();
    }
}